package com.hr.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;

/**
 * @author DSL
 * @create 2024-10-28 15:50
 */
@Configuration// 配置类
@ComponentScan( "com.hr")// 扫描包
@EnableWebMvc// 开启MVC模式作用：1.扫描@Controller 2.视图解析器 3.欢迎页 4.静态资源
public class WebMvcJavaConfig implements WebMvcConfigurer {
//    开启视图解析处理
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
       configurer.enable();
    }
    // 静态资源解析器
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        WebMvcConfigurer.super.configureViewResolvers(registry);
    }
//    开启拦截器
    /*
    方法用于向应用添加自定义的拦截器。
    拦截器可以在请求到达控制器之前或响应返回客户端之前执行一些预处理或后处理逻辑
    认证和授权
    日志记录
    性能监控
    数据预处理
    跨域处理
    */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        /*
        1. 认证和授权
认证：验证用户是否已经登录，如果没有登录则重定向到登录页面。
授权：检查用户是否有权限访问某个资源或执行某个操作。
2. 日志记录
请求日志：记录每个请求的详细信息，如请求路径、请求参数、请求时间等。
响应日志：记录每个响应的详细信息，如响应状态码、响应时间等。
3. 性能监控
性能分析：记录每个请求的处理时间，用于性能监控和优化。
流量统计：统计每个接口的访问次数，帮助分析系统负载。
4. 数据预处理
数据校验：在请求到达控制器之前对请求参数进行校验，确保数据的有效性和完整性。
数据转换：对请求参数进行格式转换，如日期格式转换、字符串转数字等。
5. 跨域处理
CORS处理：在拦截器中处理跨域请求，设置响应头以允许跨域访问。
6. 国际化
语言切换：根据请求中的语言参数或用户偏好设置国际化信息。
7. 安全性
防止XSS攻击：过滤请求参数中的恶意脚本。
防止CSRF攻击：验证请求中的CSRF令牌。
8. 缓存控制
缓存管理：设置响应头以控制浏览器缓存，减少不必要的请求。
9. 响应包装
统一响应格式：在响应返回客户端之前，统一响应格式，如添加公共字段、封装错误信息等。
        * */
//            registry.addInterceptor(new MyCustomInterceptor())//：添加一个自定义拦截器实例
//                    .addInterceptor("/**")// 拦截所有请求
//                    .excludePathPatterns("/public/**");//排除某些路径，这些路径不会被拦截器处理。
    }
//    方法用于向应用添加CORS映射。
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**") //表示此CORS配置将应用于所有URL路径
                .allowedOrigins("*") // 允许所有源发起请求，这里的“*”代表任意源。
                .allowedMethods("POST", "GET", "PUT", "DELETE") //指定了允许的HTTP方法。
                .allowedHeaders("*") ;// 表示允许任何头部信息
    }

}
